package main

import (
	"WHY_GIN/config"
	"WHY_GIN/controllers"
	"WHY_GIN/service"
	"fmt"
	"log"
	"time"

	"github.com/adshao/go-binance/v2"
	"github.com/gin-gonic/gin"
)

func main() {
	config.InitConfig() // 初始化数据库配置

	// 订单级止损管理器已删除

	// 智能止损管理器改为手动启动，通过API接口调用
	// service.InitSmartStopLossManager()

	r := gin.Default()

	// Middleware for logging
	r.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
		return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %v\"\n",
			param.ClientIP,
			param.TimeStamp.Format(time.RFC1123),
			param.Method,
			param.Path,
			param.Request.Proto,
			param.StatusCode,
			param.Latency,
			param.Request.UserAgent(),
			param.ErrorMessage,
		)
	}))
	fmt.Println("InitConfig is finish")

	// 创建Binance客户端（正式网络）
	binanceClient := binance.NewClient("", "") // 空的API密钥用于公共数据
	// 注释掉测试网络设置，使用正式网络获取真实市场数据
	// binanceClient.BaseURL = "https://testnet.binance.vision" // 使用测试网络

	// 创建预测服务
	forecastService := service.NewDogeUSDTForecastService(binanceClient)

	// 初始化预测服务数据
	log.Println("正在初始化DOGE/USDT预测服务...")
	if err := forecastService.InitializeData(); err != nil {
		log.Printf("预测服务初始化失败: %v", err)
	} else {
		log.Println("DOGE/USDT预测服务初始化成功")
	}

	// 初始化止盈管理器
	service.InitTakeProfitManager()

	// 创建控制器实例
	schedulerController := controllers.NewSchedulerController()
	forecastController := controllers.NewForecastController(forecastService)
	smartStopLossController := controllers.NewSmartStopLossController()
	takeProfitController := controllers.NewTakeProfitController()

	// Define RESTful API routes
	api := r.Group("/api")
	{
		// 用户相关接口
		api.GET("/users", controllers.GetUsers)
		api.POST("/users", controllers.CreateUser)

		// 调度器管理相关接口
		scheduler := api.Group("/scheduler")
		{
			// DOGE调度器管理
			doge := scheduler.Group("/doge")
			{
				doge.POST("/start", schedulerController.StartDogeScheduler)     // 启动DOGE调度器
				doge.POST("/stop", schedulerController.StopDogeScheduler)       // 停止DOGE调度器
				doge.GET("/status", schedulerController.GetDogeSchedulerStatus) // 获取DOGE调度器状态
			}

			// TRX调度器管理
			trx := scheduler.Group("/trx")
			{
				trx.POST("/start", schedulerController.StartTrxScheduler)     // 启动TRX调度器
				trx.POST("/stop", schedulerController.StopTrxScheduler)       // 停止TRX调度器
				trx.GET("/status", schedulerController.GetTrxSchedulerStatus) // 获取TRX调度器状态
			}

			// 全局调度器管理
			scheduler.GET("/status", schedulerController.GetAllSchedulersStatus) // 获取所有调度器状态
			scheduler.POST("/stop-all", schedulerController.StopAllSchedulers)   // 停止所有调度器

			// 止盈策略管理（调度器接口）
			takeProfit := scheduler.Group("/take-profit")
			{
				takeProfit.POST("/start", schedulerController.StartTakeProfitStrategy)                 // 启动止盈策略
				takeProfit.POST("/stop", schedulerController.StopTakeProfitStrategy)                   // 停止止盈策略
				takeProfit.GET("/status", schedulerController.GetTakeProfitStatus)                     // 获取止盈状态
				takeProfit.POST("/resistance-level", schedulerController.SetTakeProfitResistanceLevel) // 设置压力位
			}
		}

		// 预测分析相关接口
		forecast := api.Group("/forecast")
		{
			// DOGE/USDT预测分析
			dogeUsdt := forecast.Group("/doge-usdt")
			{
				dogeUsdt.GET("/score", forecastController.GetDogeUSDTScore)             // 获取评分
				dogeUsdt.GET("/status", forecastController.GetDogeUSDTStatus)           // 获取服务状态
				dogeUsdt.POST("/initialize", forecastController.InitializeDogeUSDTData) // 初始化数据
			}

			// 技术指标说明
			forecast.GET("/indicators/info", forecastController.GetIndicatorsInfo) // 获取指标说明
		}
	}

	// 订单级止损管理相关接口已删除

	// 智能止损管理相关接口
	smartStopLoss := api.Group("/smart-stop-loss")
	{
		smartStopLoss.POST("/threshold", smartStopLossController.SetLossThreshold)       // 设置亏损阈值
		smartStopLoss.GET("/threshold", smartStopLossController.GetThreshold)            // 获取亏损阈值
		smartStopLoss.POST("/quick-set-5pct", smartStopLossController.QuickSetThreshold) // 快速设置5%阈值
		smartStopLoss.GET("/status", smartStopLossController.GetStatus)                  // 获取监控状态
		smartStopLoss.POST("/start", smartStopLossController.StartMonitoring)            // 启动监控
		smartStopLoss.POST("/stop", smartStopLossController.StopMonitoring)              // 停止监控

		// 支撑位管理接口
		smartStopLoss.POST("/support-level", smartStopLossController.SetSupportLevel)              // 设置支撑位
		smartStopLoss.GET("/support-levels", smartStopLossController.GetSupportLevels)             // 获取所有支撑位
		smartStopLoss.GET("/support-level/:symbol", smartStopLossController.GetSupportLevel)       // 获取指定交易对支撑位
		smartStopLoss.DELETE("/support-level/:symbol", smartStopLossController.RemoveSupportLevel) // 删除支撑位
	}

	// 止盈策略管理相关接口
	takeProfit := api.Group("/take-profit")
	{
		takeProfit.POST("/start", takeProfitController.StartTakeProfitMonitoring)                  // 启动止盈监控
		takeProfit.POST("/stop", takeProfitController.StopTakeProfitMonitoring)                    // 停止止盈监控
		takeProfit.GET("/status", takeProfitController.GetTakeProfitStatus)                        // 获取止盈状态
		takeProfit.POST("/resistance-level", takeProfitController.SetResistanceLevel)              // 设置压力位
		takeProfit.DELETE("/resistance-level/:symbol", takeProfitController.RemoveResistanceLevel) // 移除压力位
		takeProfit.GET("/resistance-level/:symbol", takeProfitController.GetResistanceLevel)       // 获取指定压力位
		takeProfit.GET("/resistance-levels", takeProfitController.GetAllResistanceLevels)          // 获取所有压力位
		takeProfit.PUT("/strategy-params", takeProfitController.UpdateStrategyParams)              // 更新策略参数
	}

	// Start server
	r.Run(":8175") // listen and serve on 0.0.0.0:8080
}
